/**
 * @file mainwindow.h
 * @brief 图形用户界面代码的头文件
 * @author Riccardo Di Maio
 * @version 1.0 15/03/19
 */

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
// #include "core_lib_export.h"

#include <QMainWindow>
#include <QImage>
#include <QPixmap>
#include <QFileDialog>
#include <QMessageBox>
#include <QScreen>
#include <QGuiApplication>
#include <QColorDialog>
#include <QInputDialog>
#include <QLineEdit>
#include <QString>
#include <QAction>
#include <QActionGroup>

#include "clipdialog.h"

namespace Ui
{
class MainWindow;
}

/**
 * 主GUI窗口
 */
class MainWindow : public QMainWindow
{
    Q_OBJECT

    ClipDialog* clipWindow = nullptr;

  Q_SIGNALS:

    // 在状态栏显示消息时发出的信号

    void statusUpdateMessage(const QString& message, int timeout);

  public:
    explicit MainWindow(QWidget* parent = 0);
    ~MainWindow();

  private:
    Ui::MainWindow* ui;

    // 窗口设置函数

    void setupWindow();

    // 设置函数，处理模型加载时哪些按钮可用
    void setupButtons(bool modelLoaded);

    // 设置函数，将图标连接到各自的QActions
    void setupIcons();

    // 设置函数，将信号连接到各自的槽
    void setupConnects();

    // 加载模型
    void loadModel(QString inputFilename);

    // 清除已加载的模型
    void clearModel();

    // 重置相机
    void resetCamera();

  public Q_SLOTS:

    // 处理文件打开
    void handleActionOpen();

    // 处理文件保存
    void handleActionSave();

    // 处理文件关闭
    void handleActionClose();

    // 处理截图功能
    void handleActionPrint();

    // 处理外部光源的切换
    void handleActionEnableIntensity();

    // 处理坐标轴的切换
    void handleActionShowAxes();

    // 处理全屏功能
    void handleActionFullScreen();

    // 处理导出数据功能
    void handleActionExportData();

    // 处理关于功能，创建帮助对话框
    void handleActionAbout();

    // 处理重置过滤器功能
    void handleActionResetFilters();

    // 处理重置相机功能
    void handleActionResetCamera();

    // 处理重置光照功能
    void handleActionResetLighting();

    // 处理重置属性功能
    void handleActionResetProperties();

    // 加载测试.STL文件
    void handleActionStlTest();

    // 加载测试.mod文件
    void handleActionModTest();

  private Q_SLOTS:

    // 过滤器
    // 启用收缩过滤器
    void on_shrinkButton_clicked();

    // 启用裁剪过滤器
    void on_clipButton_clicked();

    // 重置过滤器
    void on_resetFiltersButton_clicked();

    // 属性
    // 显示颜色对话框，允许用户更改背景颜色
    void on_bkgColourButton_clicked();

    // 在渐变和非渐变背景之间切换
    void on_gradientCheckBox_stateChanged(int state);

    // 显示颜色对话框，允许用户更改模型颜色
    void on_modColourButton_clicked();

    // 重置颜色
    void on_resetPropertiesButton_clicked();

    // 光照
    // 关于不透明度和镜面反射滑块的说明：
    // 如果加载了STL模型，则只有一个actor，
    // 因此在移动滑块时改变不透明度不会消耗太多资源
    // 如果加载了MOD模型，则会有许多actors，
    // 因此只有在释放滑块后才会更改不透明度
    // 在移动滑块时更改.stl模型的不透明度
    void on_opacitySlider_sliderMoved(int position);

    // 在释放滑块后更改.mod模型的不透明度
    void on_opacitySlider_valueChanged(int value);

    // 在移动滑块时更改.stl模型的镜面反射
    void on_specularitySlider_sliderMoved(int position);

    // 在释放滑块后更改.mod模型的镜面反射
    void on_specularitySlider_valueChanged(int value);

    // 在移动滑块时更改外部光源强度
    void on_intensitySlider_sliderMoved(int position);

    // 切换外部光源
    void on_intensityCheckBox_stateChanged(int state);

    // 切换坐标轴
    void on_showAxesCheckBox_stateChanged(int state);

    // 重置光照
    void on_resetLightingButton_clicked();

    // 更改裁剪过滤器的裁剪平面X参数
    void on_clipXSlider_sliderMoved(int position);

    // 更改裁剪过滤器的裁剪平面Y参数
    void on_clipYSlider_sliderMoved(int position);

    // 更改裁剪过滤器的裁剪平面Z参数
    void on_clipZSlider_sliderMoved(int position);

    // 更改裁剪过滤器的裁剪平面旋转X参数
    void on_clipXDial_sliderMoved(int position);

    // 更改裁剪过滤器的裁剪平面旋转Y参数
    void on_clipYDial_sliderMoved(int position);

    // 更改裁剪过滤器的裁剪平面旋转Z参数
    void on_clipZDial_sliderMoved(int position);

    // 接受新的裁剪过滤器参数，关闭裁剪对话框
    void on_clipDialog_dialogAccepted();

    // 将裁剪过滤器参数重置为之前的状态
    void on_clipDialog_dialogRejected();

    // 相机
    // 相机功能说明：
    // 视图向上向量必须设置为与相机方向正交
    // 重置相机
    void on_resetCameraButton_clicked();

    // 将相机设置在X轴上
    void on_posXButton_clicked();

    // 将相机设置在Y轴上
    void on_posYButton_clicked();

    // 将相机设置在Z轴上
    void on_posZButton_clicked();

    // 将相机顺时针旋转90度
    void on_pos90Button_clicked();

    // 将相机设置在负X轴上
    void on_negXButton_clicked();

    // 将相机设置在负Y轴上
    void on_negYButton_clicked();

    // 将相机设置在负Z轴上
    void on_negZButton_clicked();

    // 将相机逆时针旋转90度
    void on_neg90Button_clicked();

    // 可视化
    // 切换线框可视化
    void on_wireframeRadio_toggled(bool checked);

    // 切换点可视化
    void on_pointsRadio_toggled(bool checked);

    // 切换表面(默认)    可视化
    void on_surfaceRadio_toggled(bool checked);
};

#endif  // MAINWINDOW_H